import socket
import urllib.request
import urllib.error
import time
import re

def get_ip_list():
    """
    获取IP地址列表的函数
    由于Python标准库无法直接解析Excel文件，提供多种获取IP的方式
    """
    ips = []
    
    print("\n注意：Python标准库无法直接解析Excel文件格式。")
    print("请选择IP输入方式：")
    print("1. 手动输入IP地址")
    print("2. 从文本文件读取IP地址")
    
    choice = input("请输入选择 (1/2): ")
    
    if choice == '1':
        print("\n请手动输入IP地址，每行一个，输入空行结束：")
        while True:
            ip_input = input("IP地址: ")
            if not ip_input:
                break
            # 验证IP地址格式
            parts = ip_input.split('.')
            if len(parts) == 4 and all(0 <= int(part) <= 255 for part in parts):
                ips.append(ip_input)
                print(f"已添加: {ip_input}")
            else:
                print("无效的IP地址格式，请重新输入。")
    
    elif choice == '2':
        txt_file = input("请输入文本文件路径 (默认为 ips.txt): ") or "ips.txt"
        try:
            with open(txt_file, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if not line or line.startswith('#'):
                        continue
                    # 验证IP地址格式
                    parts = line.split('.')
                    if len(parts) == 4 and all(0 <= int(part) <= 255 for part in parts):
                        ips.append(line)
            print(f"\n从文件 {txt_file} 中读取了 {len(ips)} 个IP地址")
        except Exception as e:
            print(f"读取文件时出错: {e}")
            print("\n请确保文件存在并且格式正确（每行一个IP地址）")
            # 回退到手动输入
            return get_ip_list()
    
    else:
        print("无效的选择，默认使用手动输入方式")
        return get_ip_list()
    
    return ips

def test_ip(ip, timeout=5):
    """
    测试IP是否可用于访问百度官网
    """
    print(f"正在测试 IP: {ip}")
    
    # 首先测试IP是否可以ping通
    try:
        # 使用socket连接测试
        socket.setdefaulttimeout(timeout)
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect((ip, 80))
        print(f"  - IP {ip} 连接成功")
    except Exception as e:
        print(f"  - IP {ip} 连接失败: {e}")
        return False
    
    # 然后尝试使用这个IP代理访问百度
    try:
        proxy_handler = urllib.request.ProxyHandler({
            'http': f'http://{ip}:80',
            'https': f'https://{ip}:443'
        })
        opener = urllib.request.build_opener(proxy_handler)
        opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')]
        urllib.request.install_opener(opener)
        
        # 设置超时时间
        response = urllib.request.urlopen('http://www.baidu.com', timeout=timeout)
        status_code = response.getcode()
        
        print(f"  - 访问百度状态码: {status_code}")
        return status_code == 200
    except urllib.error.URLError as e:
        print(f"  - 访问百度失败: {e}")
        return False
    except Exception as e:
        print(f"  - 测试过程中发生错误: {e}")
        return False

def export_ips_to_csv(ips, output_file):
    """
    将可用的IP导出为CSV格式文件，可直接用Excel打开
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write('可用IP地址\n')
            for ip in ips:
                f.write(f'{ip}\n')
        print(f"\n可用IP已导出到: {output_file}")
        print("提示：CSV文件可以直接用Excel打开")
    except Exception as e:
        print(f"导出文件时出错: {e}")

def main():
    print("IP状态测试工具")
    print("=" * 30)
    print("本工具将测试IP地址是否可用于访问百度官网")
    print("=" * 30)
    
    output_file = r'c:\Users\Administrator\Desktop\ip_pool\available_ips.csv'
    
    # 获取IP地址列表
    ips = get_ip_list()
    
    if not ips:
        print("没有找到有效的IP地址，请检查文件或手动输入。")
        return
    
    print(f"\n找到 {len(ips)} 个IP地址，开始测试...")
    print("=" * 30)
    
    available_ips = []
    start_time = time.time()
    
    for i, ip in enumerate(ips, 1):
        print(f"\n[{i}/{len(ips)}]")
        if test_ip(ip):
            available_ips.append(ip)
            print(f"  - IP {ip} 可用!")
        time.sleep(1)  # 避免请求过快
    
    end_time = time.time()
    
    print("\n" + "=" * 30)
    print(f"测试完成! 耗时: {end_time - start_time:.2f} 秒")
    print(f"总IP数: {len(ips)}")
    print(f"可用IP数: {len(available_ips)}")
    
    if available_ips:
        print("\n可用的IP地址：")
        for ip in available_ips:
            print(f"  - {ip}")
        
        export_ips_to_csv(available_ips, output_file)
    else:
        print("\n没有找到可用的IP地址")

if __name__ == "__main__":
    main()